//
// Created by user on 20-4-24.
//

#ifndef _SLAB_H_
#define _SLAB_H_

#include "../GeneralLibrary/Printf.h"
#include "../GeneralLibrary/Lib.h"
#include "Memory.h"

/*============================ 结构体重命名区 ================================*/

typedef struct SlabStruct Slab;
typedef struct SlabCacheStruct SlabCache;

/*============================ 结构体定义区 ================================*/
// Slab结构体
struct SlabStruct {

    List list;                  // 用于链接前一个和后一个 SlabStruct
    Page *pPage;                // 用于指向本分配器的物理页面

    unsigned long usingCount;   // 使用的数量
    unsigned long freeCount;    // 释放的数量

    void *pVirtualAddress;      // 当前页面所在线性地址

    unsigned long colorLength;  // 着色区长度
    unsigned long colorCount;   // 着色区的数量

    unsigned long *pColorMap;   // 着色区的首地址

};

/**
 * 高速缓存结构体
 */
struct SlabCacheStruct {

    unsigned long size;         // 大小
    unsigned long totalUsing;   // 总共使用的数量
    unsigned long totalFree;    // 总共释放的数量

    Slab *pCachePool;           // 分配器指针
    Slab *pCacheDmaPool;        // DMA分配器指针

    void *(*constructor)(void *pVirtualAddress, unsigned long arg); // 分配器构造函数

    void *(*destructor)(void *pVirtualAddress, unsigned long arg);  // 分配器析构函数

};

/*============================ 外部变量声明区 ================================*/

//extern GlobalMemoryDescriptor memoryManagementStruct;
extern SlabCache kmallocCacheSize[16];

/*============================ 函数声明区 ================================*/

/**
 * 初始化Slab分配器
 * @return 返回 0 或 1
 */
unsigned long slabInit();


/**
 * 创建高速缓存
 * @param size 高速缓存大小
 * @param constructor 高速缓存的构造函数
 * @param destructor 高速缓存的析构函数
 * @param arg 参数
 * @return
 */
SlabCache *slabCreate(unsigned long size, void *(*constructor)(void *pVirtualAddress, unsigned long arg),
                      void *(*destructor)(void *pVirtualAddress, unsigned long arg), unsigned long arg);


/**
 * 销毁高速缓存
 * @param pSlabCache 高速缓存结构体指针
 * @return 返回 0 和 1
 */
unsigned long slabDestroy(SlabCache *pSlabCache);


/**
 * 指定高速缓存分配指定的高速缓存的设置的大小的对象
 * @param pSlabCache 指定的高速缓存
 * @param arg 传给构造函数的参数
 * @return
 */
void *slabMalloc(SlabCache *pSlabCache, unsigned long arg);


/**
 * 释放对象
 * @param pSlabCache 指定的高速缓存
 * @param address 要释放的地址
 * @param arg 传给析构函数的参数
 * @return 返回 0 或 1
 */
unsigned long slabFree(SlabCache *pSlabCache, void *address, unsigned long arg);


#endif //_SLAB_H_
